package com.linxuan.reggie.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * 创建Redis配置类，设置一下键与哈希键的序列化器
 * 我们目的是使用RedisTemplate存储与获取的时候让其键与哈希键序列化时使用String，从而不得不设置序列化器
 * 可以直接使用StringRedisTemplate来进行存储与获取，不使用RedisTemplate，它已经帮我们设置好String序列化器了
 */
@Configuration
public class RedisConfig {

    /**
     * 第三方Bean对象RedisTemplate交由Spring管理，可以不设置默认已经管理了，但是这里要设置一下序列化器
     * 如果存储字符串类型的，不需要序列化。但如果存储Bean对象或者集合类型的数据，就必须要序列化
     */
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory) {

        // new RedisTemplate对象，里面设置一些属性
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();

        // 将键与hash键的学历话器都设置为StringRedisSerializer。
        // 因为默认都是JDK序列化器，但是这样向redis里面存储会添加一些前缀，所以需要设置为String序列化器
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());

        // 设置连接工厂
        redisTemplate.setConnectionFactory(factory);
        return redisTemplate;
    }
}
